package com.zhoug.common3.utils;

import android.graphics.PointF;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

/**
 * 描述：数学工具
 * zhougan
 * 2019/3/16
 **/
public class MathUtils {
    private static final String TAG = ">>>MathUtils";
    private static final boolean DEBUG = false;


    /**
     * 四舍五入 保留几位小数
     * @param value   值
     * @param decimals 小数位数
     * @return
     */
    public static double getDecimal(String value, int decimals) {
        //这里一定不要直接使用new BigDecimal(double)的构造方法，
        //而要使用new BigDecimal(String)的方式，不然会出现精确问题
        BigDecimal bd = new BigDecimal(value);
        BigDecimal bigDecimal = bd.setScale(decimals, BigDecimal.ROUND_HALF_UP);
        return bigDecimal.doubleValue();//2位double
    }

    /**
     * 四舍五入 保留几位小数
     * @param value   值
     * @param decimals 小数位数
     * @return
     */
    public static double getDecimal(double value, int decimals) {
        return getDecimal(String.valueOf(value),decimals);
    }



    /**
     *  DecimalFormat:
     * 1.整数：若是n个0，就从个位开始向高位填充，如果有值就是原来的值，没有就填充0。
     *                 若都是#，没有实际意义，不管是几个#，最后的结果都是原来的整数。
     *                 0和#配合使用，只能是"##00",不能是"00##",就是#在前0在后。实现是上面的合集。
     *2.小数：是可以保留小数点后几位的（几个0后或几个#）。
     *                 若n个0，就是保留n位小数，小数不足的部分用0填充。
     *                 若n个#，就是保留n位小数，小数不足部分没有就是没有。
     *                 0和#配合使用，只能是".00##",不能是".##00",就是0在前#在后。实现和上面一样
     */

    /**
     * 格式化输出字符串,保留几位小数
     * @param value 小数字符串
     * @param decimals 保留几位小数
     * @param fillEnd 小数位数不够结尾是否填充0
     * @return
     */
    public static String formatDecimalUp(String value, int decimals,boolean fillEnd){
        StringBuilder patternBuilder=new StringBuilder();
        if(decimals==0){
            patternBuilder.append("#");
        }else{
            patternBuilder.append("#.");
            for (int i = 0; i < decimals; i++) {
                if(fillEnd){
                    patternBuilder.append("0");
                }else{
                    patternBuilder.append("#");
                }
            }
        }
        String pattern = patternBuilder.toString();
        LogUtils.d(TAG, "pattern:"+pattern);
        DecimalFormat decimalFormat = new DecimalFormat(pattern);
        decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
        return decimalFormat.format(new BigDecimal(value));
    }

    /**
     * 格式化输出字符串,保留几位小数
     * @param value 小数字符串
     * @param decimals 保留几位小数
     * @param fillEnd 小数位数不够结尾是否填充0
     * @return
     */
    public static String formatDecimalUp(double value, int decimals,boolean fillEnd){
        return formatDecimalUp(String.valueOf(value),decimals,fillEnd);
    }


    /**
     * 获取最大值
     *
     * @param array
     * @return
     */
    public static float getMax(float... array) {
        float max = 0;
        if (array != null && array.length > 0) {
            for (int i = 0; i < array.length; i++) {
                if (i == 0) {
                    max = array[0];
                } else {
                    max = Math.max(max, array[i]);
                }
            }
        }
        return max;
    }

    /**
     * 获取最大值
     *
     * @param array
     * @return
     */
    public static float getMax(int... array) {
        int max = 0;
        if (array != null && array.length > 0) {
            for (int i = 0; i < array.length; i++) {
                if (i == 0) {
                    max = array[0];
                } else {
                    max = Math.max(max, array[i]);
                }
            }
        }
        return max;
    }

    /**
     * 角度转化为弧度
     *
     * @param degree 角度
     * @return 弧度
     */
    public static double degreeToRad(double degree) {
        return degree * Math.PI / 180;
    }

    /**
     * 弧度转化为角度
     *
     * @param rad 弧度
     * @return 角度
     */
    public static double radToDegree(double rad) {
        return rad * 180 / Math.PI;
    }


    /**
     * 求圆上指定弧度的x坐标
     *
     * @param centerX 圆心x坐标
     * @param radius  半径
     * @param degree  角度(0-360)
     * @return
     */
    public static float getArcXPoint(float centerX, float radius, float degree) {
        //x0 + r * cos(angle * PI / 180)
        return (float) (centerX + radius * Math.cos(degree * Math.PI / 180));
    }

    /**
     * 求圆上指定弧度的y坐标
     *
     * @param centerY 圆心y坐标
     * @param radius  半径
     * @param degree  角度(0-360)
     * @return
     */
    public static float getArcYPoint(float centerY, float radius, float degree) {
        //y0 + r * sin(angle * PI /180)
        return (float) (centerY + radius * Math.sin(degree * Math.PI / 180));
    }

    /**
     * 求圆上指定弧度的xy坐标
     *
     * @param centerX 圆心x坐标
     * @param centerY 圆心y坐标
     * @param radius  半径
     * @param degree  角度(0-360)
     * @return
     */
    public static PointF getArcPoint(float centerX, float centerY, float radius, float degree) {
        //x0 + r * cos(angle * PI / 180)
        //y0 + r * sin(angle * PI /180)
        PointF pointF = new PointF();
        pointF.x = (float) (centerX + radius * Math.cos(degree * Math.PI / 180));
        pointF.y = (float) (centerY + radius * Math.sin(degree * Math.PI / 180));
        return pointF;
    }

    /**
     * 计算点到圆心的角度
     * @param disY 点y坐标到圆心的距离
     * @param disX 点x坐标到圆心的距离
     * @return
     */
    public static double getAngle(float disX,float disY) {
        double angle= radToDegree(Math.atan2(disY, disX));
        if(angle<0){
            angle=360+angle;
        }
        return angle;
    }





}



